<?php if(!defined('WDK_PATH')) exit('No direct script access allowed');
/**
 * @since 2011. 9. 30
 * @author kinuz
 */
class UploadFileSizeException extends WException {}
class UploadFileExtsException extends WException {}
class Hp_Uploader
{
	public
		/******************************************************/
		//	
		/******************************************************/
		$save_path		=	UPLOAD_PATH,
		$upload_size	=	1024,
		$upload_exts	=	'*',
		$files			=	array();
		
	/**
	 * 	생성자
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	function __construct()
	{
		require_once WDK_PATH.'core/mimes.php';
		$this->mimes = $mimes;
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	public function load($post_name='', $path='/')
	{
		$this->save_path = str_replace('//', '/', UPLOAD_PATH.$path.'/');
		$upload_file_size = 0;
		$uploaded = false;
		if(isset($_FILES))
		{
			foreach($_FILES as $name=>$file)
			{
				if($post_name == $name)
				{
					if(is_string($file['name']))
					{
						if($file['name'] === '') continue;
						$uploaded = true;
						$this->checkExt($file['name'], $file['type']);
						$this->files[$post_name] = array('name'	=>	$file['name'],
													'type'	=>	$file['type'],
													'path'	=>	$this->move($file['tmp_name']),
													'size'	=>	$this->sizeFormat($file['size'])
												);
						$upload_file_size = $file['size'];
					}
					else
					{
						$this->files[$post_name] = array();
						foreach($file['name'] as $idx=>$n)
						{
							$this->checkExt($file['name'][$idx], $file['type'][$idx]);
							if($file['name'][$idx] == '')	continue;
							$uploaded = true;
							$this->files[$post_name][$idx] = array(	'name'	=>	$file['name'][$idx],
																	'type'	=>	$file['type'][$idx],
																	'path'	=>	$this->move($file['tmp_name'][$idx]),
																	'size'	=>	$this->sizeFormat($file['size'][$idx])
															);
							if($file['size'][$idx] > $upload_file_size)
							{
								$upload_file_size = $file['size'][$idx];
							}
						}
					}
				}
			}
		}
		if($uploaded && $upload_file_size > $this->upload_size*1024)
		{
			throw new UploadFileSizeException("업로드 가능한 크기[{$this->upload_size}] 이상으로 업로드 하였습니다 : {$upload_file_size}");
		}
		return $uploaded;
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	private function checkExt($name, $type)
	{
		if($this->upload_exts == '*')	return;
		if(is_string($this->upload_exts))
		{
			$this->upload_exts = explode(';', $this->upload_exts);
		}
		$info = pathinfo($name);
		if($info['extension'] == '') throw new UploadFileExtsException("업로드 가능한 파일(확장자)이 아닙니다.");
 		if(in_array(".".$info['extension'], $this->upload_exts) == false)	throw new UploadFileExtsException("업로드 가능한 파일이 아닙니다.");
 		$mime = (array) $this->mimes[$info['extension']];
 		if(in_array($type, $mime) == false)	throw new UploadFileExtsException("업로드 가능한 파일(타입)이 아닙니다.");
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	public function get($name='')
	{
		return $this->files[$name];
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	private function fname()
	{
		return date('ymdH_').uniqid(rand(1,99999)).rand(1,999);
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	private function move($str)
	{
		@mkdir($this->save_path);
		$path = $this->save_path.$this->fname();
		@move_uploaded_file($str, $path);
		@chmod($str, 0644);
		return str_replace(BASE_PATH, '/', $path);
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	public function remove($path=array())
	{
		$path = (array) $path;
		foreach($path as $p)
		{
			@unlink(str_replace('//', '/', BASE_PATH.$p));			
		}
	}
	
	/**
	 *	데이터 초기화 시키기
	 * @since 2011. 9. 30
	 * @author kinuz
	 */
	private function sizeFormat($size=0, $idx=0)
	{
		if($size < 10240)
		{
			switch($idx)
			{
				case 0:	$unit = " Bytes"; break;
				case 1:	$unit = " KB"; break;
				case 2:	$unit = " Mb"; break;
				case 3:	$unit = " Gb"; break;
			}
			return (round($size)/10).$unit;
		}
		return $this->sizeFormat(($size/1024)*10, ++$idx);
	}
}